import com.shuai.java.Student;
import com.shuai.java.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * @author Jiange
 * @create 2021-04-20-14:15
 */

/**
 * 在有多个参数的时候 会被封装成map  key就是param1~paramn  value就是我们传入的参数值
 * 对于传入的参数是List或者数组的时候 也会封装成map  key就是Collection 就是collection List就是list
 * 数组的key就是array
 * @Param("id") int id 这样时key就是id
 * 或者我们可以直接传入一个map #{key}就可以取出值
 * 使用${} 取出的值会直接拼装在原来的sql上 不能防止sql注入 对于原生JDBC不支持占位符的地方用这个  如表名、order by的字段名和asc desc
 * #{}会是以  预编译的方式用占位符 大多情况下应该使用#{}
 * #{} 可以规定规则
 *  如JDBCType  在数据为null时有时  mybatis的null映射成为Other类型 mysql可以识别 Oracle不能
 *  #{Sname ,jdbcType=NULL}
 *
 * 查询
 *      如果返回的是一个集合  返回值类型写list的存储的类型
 *      返回一条记录 map key是列名  值就是对应的值
 */
public class Mytest {
    @Test
    public void test1() throws IOException {
        //根据配置文件创建工厂对象
        String resource = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取sqlsession实例、能直接执行已经映射的sql语句
        SqlSession sqlSession = sqlSessionFactory.openSession();//sqlsession代表和数据库的一次会话 用完关闭 不是线程安全的  每次使用都要重新获取 不能放在类的属性内

        System.out.println(sqlSession);

        //第一个参数是sql的唯一标识
        try{
            Student selectstu = sqlSession.selectOne("com.jian.java.selectstu",1);
            System.out.println(selectstu);
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void test2() throws IOException {
        String source = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(source);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);//会为接口自动创建创建一个代理对象

        Student byId = mapper.getById(1);

        System.out.println(byId);//com.jian.java.Student{Sno='1', Sname='李子建', sex='男'}
    }

    @Test
    public void test3() throws IOException {
        String source = "mybatis.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(source);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();//不会自动提交

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //mybatis允许的增删改直接定义以下类型返回值 integer  long Boolean  void  记得要手动提交
//        mapper.add(new Student("8","尚硅谷","男"));
        mapper.delete("8");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void test4() throws IOException {
        String resource = "mybatis.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

//        List<Student> all = mapper.getAll();
//        all.forEach(System.out::println);

//        Map<String, Object> returnMap = mapper.getReturnMap("2");
//        System.out.println(returnMap);

        Map<Integer, Student> stuMap = mapper.getStuMap();
        System.out.println(stuMap);
    }
}
